<!DOCTYPE html>
<html lang="ja">

<head>
  <meta charset="utf-8">
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <meta http-equiv="Content-Style-Type" content="text/css">
  <script src='../bbs.js'></script>

  <!-- Global site tag (gtag.js) - Google Analytics -->
  <script async src="https://www.googletagmanager.com/gtag/js?id=UA-120820034-1"></script>

  <link href="../bbs.css" type="text/css" rel="stylesheet">
  <link rel="shortcut icon" href="/favicon.ico">
  <title>不具合：「開きません」のキャンセルが存在しません | サクラエディタ過去ログ</title>
</head>
<body>
<ul class="side">
        <a href="./" class="toindex">◀Unicode版開発トップへ</a>
        <li><div class="list-title">
    <span class="no">2152</span>
    <a class="thread-title" href="2152.html#2152">不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2153</span>
    <a class="thread-title" href="2152.html#2153">Re:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2154</span>
    <a class="thread-title" href="2152.html#2154">Re2:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2155</span>
    <a class="thread-title" href="2152.html#2155">Re3:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2165</span>
    <a class="thread-title" href="2152.html#2165">Re4:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2166</span>
    <a class="thread-title" href="2152.html#2166">Re5:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2168</span>
    <a class="thread-title" href="2152.html#2168">Re6:不具合：「開きません」のキャンセルが存在しません</a></div>
    </li></ul></li><li><div class="list-title">
    <span class="no">2172</span>
    <a class="thread-title" href="2152.html#2172">Re5:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2173</span>
    <a class="thread-title" href="2152.html#2173">Re6:不具合：「開きません」のキャンセルが存在しません</a></div>
    </li><li><div class="list-title">
    <span class="no">2175</span>
    <a class="thread-title" href="2152.html#2175">Re6:不具合：「開きません」のキャンセルが存在しません</a></div>
    </li><li><div class="list-title">
    <span class="no">2177</span>
    <a class="thread-title" href="2152.html#2177">Re6:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2178</span>
    <a class="thread-title" href="2152.html#2178">代替案パッチ</a></div>
    </li><li><div class="list-title">
    <span class="no">2179</span>
    <a class="thread-title" href="2152.html#2179">noviceさん</a></div>
    </li><li><div class="list-title">
    <span class="no">2181</span>
    <a class="thread-title" href="2152.html#2181">代替案パッチ（改） 1/2</a></div>
    <ul><li><div class="list-title">
    <span class="no">2182</span>
    <a class="thread-title" href="2152.html#2182">Re:代替案パッチ（改） 2/2</a></div>
    <ul><li><div class="list-title">
    <span class="no">2189</span>
    <a class="thread-title" href="2152.html#2189">パッチ訂正</a></div>
    </li></ul></li></ul></li></ul></li></ul></li><li><div class="list-title">
    <span class="no">2183</span>
    <a class="thread-title" href="2152.html#2183">Re5:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2186</span>
    <a class="thread-title" href="2152.html#2186">Re6:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2187</span>
    <a class="thread-title" href="2152.html#2187">Re7:不具合：「開きません」のキャンセルが存在しません</a></div>
    </li><li><div class="list-title">
    <span class="no">2188</span>
    <a class="thread-title" href="2152.html#2188">Re7:不具合：「開きません」のキャンセルが存在しません</a></div>
    <ul><li><div class="list-title">
    <span class="no">2265</span>
    <a class="thread-title" href="2152.html#2265">Re8:不具合：「開きません」のキャンセルが存在しません</a></div>
    </li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li>
    </ul><ul class="main"><li><section><h1 id=2152>
    <span class="no">[2152]</span>
    <a class="thread-title" href="#2152">不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">Viu89r9VV</span>
    <time datetime="2014-04-16T23:33:38">2014年04月16日 23:33</time></h1>
    <div class="body">環境（Environment）: Windows 7, サクラエディタ 2.1.1.1<br><br>前回ファイルを「UTF-8」で開き、今回「SJIS」で開こうとした場合、以下の警告メッセージが表示されます。<br><br>----------------------------------------<br>文字コード情報<br>パス\ファイル名.txt<br><br>このファイルを文字コード SJIS で開こうとしていますが、前回は別の文字コード UTF-8 で開かれています。前回と同じ文字コードを使いますか?<br><br>・[はい(Y)] ＝UTF-8<br>・[いいえ(N)]＝SJIS<br>・[キャンセル]＝開きません<br><br>[はい] [いいえ]<br>----------------------------------------<br><br>しかし、「キャンセル」のボタンが存在しないため、キャンセルできません。画面右上に [×] マークは存在しますが、グレー アウトしていて押せません。これは不具合ということで よろしいのでしょうか。報告しておきます。<br></div></section>
    <ul><li><section><h1 id=2153>
    <span class="no">[2153]</span>
    <a class="thread-title" href="#2153">Re:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">novice</span>
    <time datetime="2014-04-19T23:27:52">2014年04月19日 23:27</time></h1>
    <div class="body">▼ Viu89r9VVさん<br>&gt; しかし、「キャンセル」のボタンが存在しないため、キャンセルできません。画面右上に [×] マークは存在しますが、グレー アウトしていて押せません。これは不具合ということで よろしいのでしょうか。報告しておきます。<br><br>patchを登録しました。<br><a href=http://sourceforge.net/p/sakura-editor/patchunicode/800/ target=_top><nobr>http://<wbr>sourcefo<wbr>rge.<wbr>net/<wbr>p/<wbr>sakura-<wbr>editor/<wbr>patchuni<wbr>code/<wbr>800/<wbr></nobr></a><br></div></section>
    <ul><li><section><h1 id=2154>
    <span class="no">[2154]</span>
    <a class="thread-title" href="#2154">Re2:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">神楽</span>
    <time datetime="2014-04-20T17:05:00">2014年04月20日 17:05</time></h1>
    <div class="body">▼ noviceさん<br>&gt; ▼ Viu89r9VVさん<br>&gt; &gt; しかし、「キャンセル」のボタンが存在しないため、キャンセルできません。画面右上に [×] マークは存在しますが、グレー アウトしていて押せません。これは不具合ということで よろしいのでしょうか。報告しておきます。<br>&gt; <br>&gt; patchを登録しました。<br>&gt; <a href=http://sourceforge.net/p/sakura-editor/patchunicode/800/ target=_top><nobr>http://<wbr>sourcefo<wbr>rge.<wbr>net/<wbr>p/<wbr>sakura-<wbr>editor/<wbr>patchuni<wbr>code/<wbr>800/<wbr></nobr></a><br>ANSI版（1.6.6.0）にはキャンセルの説明があり、キャンセルボタンもあります。<br>ANSI版の仕様に合わせた方が良いのではないでしょうか？</div></section>
    <ul><li><section><h1 id=2155>
    <span class="no">[2155]</span>
    <a class="thread-title" href="#2155">Re3:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">novice</span>
    <time datetime="2014-04-20T17:50:43">2014年04月20日 17:50</time></h1>
    <div class="body">▼ 神楽さん<br>Unicode版は、r1587でキャンセルが削除されたようです。<br><a href=http://sourceforge.net/p/sakura-editor/code/1587/ target=_top><nobr>http://<wbr>sourcefo<wbr>rge.<wbr>net/<wbr>p/<wbr>sakura-<wbr>editor/<wbr>code/<wbr>1587/<wbr></nobr></a><br><br>PatchUnicodeは未登録で、掲示板にログが残ってましたが、キャンセルの削除については特に記載が見つかりませんでした。<br><a href=http://sakura-editor.sourceforge.net/cgi-bin/cyclamen/cyclamen.cgi?log=unicode&v=950 target=_top><nobr>http://<wbr>sakura-<wbr>editor.<wbr>sourcefo<wbr>rge.<wbr>net/<wbr>cgi-<wbr>bin/<wbr>cyclamen<wbr>/<wbr>cyclamen<wbr>.<wbr>cgi?<wbr>log=<wbr>unicode&amp;<wbr>v=<wbr>950</nobr></a><br></div></section>
    <ul><li><section><h1 id=2165>
    <span class="no">[2165]</span>
    <a class="thread-title" href="#2165">Re4:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">神楽</span>
    <time datetime="2014-05-08T06:21:50">2014年05月08日 06:21</time></h1>
    <div class="body">▼ noviceさん<br>2.1.1.1も同じ挙動だったのですが、2.1.1.2で文字コード情報の<br>メッセージダイアログがアクティブの時に、<br>Ctrl+Cでダイアログタイトルバー通りの「文字コード情報」とコピーされず、<br>「(保存されていません)」と「(印刷プレビューでのみ使用できます)」が<br>Ctrl+Cする度に、交互に繰り返されます。<br>1.6.6.0ではタイトルバー通りにコピーされますので、できれば対策をお願い致します。</div></section>
    <ul><li><section><h1 id=2166>
    <span class="no">[2166]</span>
    <a class="thread-title" href="#2166">Re5:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-08T20:38:59">2014年05月08日 20:38</time></h1>
    <div class="body">ちゃんと検証したわけではないのでアレですが…<br><br>&gt; 「(保存されていません)」と「(印刷プレビューでのみ使用できます)」が<br>&gt; Ctrl+Cする度に、交互に繰り返されます。<br><br>これ、メッセージボックス出しているときにエディタウィンドウのアクティブ／非アクティブ切替が発生し、<br>CEditWnd::UpdateCaption()<br> → CSakuraEnvironment::ExpandParameter()<br>が呼ばれてメッセージバッファの書き換え（CLoadStringでのバッファリサイクル）が起きているせいではないでしょうか。<br><br>メッセージボックス上でCtrl+Cされるたびに、MessageBox APIが引数の文字列ポインタを直接参照しているのかな？、と思うわけです。<br>メッセージ本文のほうが無事なのは、MYMESSAGEBOXが本文を別のバッファにコピーしてMessageBox APIに渡しているからかも。</div></section>
    <ul><li><section><h1 id=2168>
    <span class="no">[2168]</span>
    <a class="thread-title" href="#2168">Re6:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-09T17:42:18">2014年05月09日 17:42</time></h1>
    <div class="body">&gt; メッセージ本文のほうが無事なのは、MYMESSAGEBOXが本文を別のバッファにコピーしてMessageBox APIに渡しているからかも。<br><br>案の定、[共通設定]-[強調キーワード]の[整理]ボタンを押したときに<br>表示されるメッセージボックスで、本文のほうに同様の症状が出ました。<br><br>下記のように、CSakuraEnvironment::ExpandParameter()で<br>コール時に毎回ではなく、言語切替時だけLoadStringするように<br>変更したところ、自環境では改善しました。<br><br>Index: sakura_core/env/CSakuraEnvironment.cpp<br>===================================================================<br>--- sakura_core/env/CSakuraEnvironment.cpp&#9;(リビジョン 3706)<br>+++ sakura_core/env/CSakuraEnvironment.cpp&#9;(作業コピー)<br>@@ -90,11 +90,22 @@<br> &#9;const CEditDoc* pcDoc = CEditDoc::GetInstance(0); //###<br> <br> &#9;// Apr. 03, 2003 genta 固定文字列をまとめる<br>-&#9;const wstring&#9;PRINT_PREVIEW_ONLY&#9;&#9;= LSW( STR_PREVIEW_ONLY );&#9;//L"(印刷プレビューでのみ使用できます)";<br>+&#9;static HINSTANCE s_hRsrc = NULL;<br>+&#9;static wstring&#9;PRINT_PREVIEW_ONLY&#9;&#9;= L"";&#9;//L"(印刷プレビューでのみ使用できます)";<br>+&#9;static wstring&#9;NO_TITLE&#9;&#9;&#9;&#9;= L"";&#9;//L"(無題)";<br>+&#9;static wstring&#9;NOT_SAVED&#9;&#9;&#9;&#9;= L"";&#9;//L"(保存されていません)";<br>+<br>+&#9;// 初回と言語切替時に文字列をロードする<br>+&#9;HINSTANCE hRsrc = CSelectLang::getLangRsrcInstance();<br>+&#9;if( s_hRsrc != hRsrc ){<br>+&#9;&#9;s_hRsrc = hRsrc;<br>+&#9;&#9;PRINT_PREVIEW_ONLY&#9;&#9;= LSW( STR_PREVIEW_ONLY );<br>+&#9;&#9;NO_TITLE&#9;&#9;&#9;&#9;= LSW( STR_NO_TITLE1 );<br>+&#9;&#9;NOT_SAVED&#9;&#9;&#9;&#9;= LSW( STR_NOT_SAVED );<br>+&#9;}<br>+<br> &#9;const int&#9;&#9;PRINT_PREVIEW_ONLY_LEN&#9;= PRINT_PREVIEW_ONLY.length();<br>-&#9;const wstring&#9;NO_TITLE&#9;&#9;&#9;&#9;= LSW( STR_NO_TITLE1 );&#9;//L"(無題)";<br> &#9;const int&#9;&#9;NO_TITLE_LEN&#9;&#9;&#9;= NO_TITLE.length();<br>-&#9;const wstring&#9;NOT_SAVED&#9;&#9;&#9;&#9;= LSW( STR_NOT_SAVED );&#9;//L"(保存されていません)";<br> &#9;const int&#9;&#9;NOT_SAVED_LEN&#9;&#9;&#9;= NOT_SAVED.length();<br> <br> &#9;const wchar_t *p, *r;&#9;//&#9;p：目的のバッファ。r：作業用のポインタ。<br><br></div></section>
    </li></ul></li><li><section><h1 id=2172>
    <span class="no">[2172]</span>
    <a class="thread-title" href="#2172">Re5:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">novice</span>
    <time datetime="2014-05-11T16:44:12">2014年05月11日 16:44</time></h1>
    <div class="body">▼ 神楽さん<br>&gt; 「(保存されていません)」と「(印刷プレビューでのみ使用できます)」が<br>&gt; Ctrl+Cする度に、交互に繰り返されます。<br><br>patchを登録しました。<br><a href=http://sourceforge.net/p/sakura-editor/patchunicode/816/ target=_top><nobr>http://<wbr>sourcefo<wbr>rge.<wbr>net/<wbr>p/<wbr>sakura-<wbr>editor/<wbr>patchuni<wbr>code/<wbr>816/<wbr></nobr></a><br></div></section>
    <ul><li><section><h1 id=2173>
    <span class="no">[2173]</span>
    <a class="thread-title" href="#2173">Re6:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-11T17:52:03">2014年05月11日 17:52</time></h1>
    <div class="body">&gt; patchを登録しました。<br>&gt; <a href=http://sourceforge.net/p/sakura-editor/patchunicode/816/ target=_top><nobr>http://<wbr>sourcefo<wbr>rge.<wbr>net/<wbr>p/<wbr>sakura-<wbr>editor/<wbr>patchuni<wbr>code/<wbr>816/<wbr></nobr></a><br><br>このパッチですが、直接MessageBox APIを呼び出している個所には効果が無さげです。<br>&gt;&gt;unicode:2168の冒頭で例示した[整理]ボタンで出るメッセージボックスは直に呼び出してます。</div></section>
    </li><li><section><h1 id=2175>
    <span class="no">[2175]</span>
    <a class="thread-title" href="#2175">Re6:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-12T17:50:31">2014年05月12日 17:50</time></h1>
    <div class="body">trunk2_VMessageBoxF_fix_b.patchでMessageBox()-&gt;MYMESSAGEBOX()置換されたようですが、置換方法に問題があるようです。<br>MYMESSAGEBOX()の第４引数は「メッセージ文字列」ではなく「メッセージ用の書式指定文字列」であることに注意しないと。<br><br>上記パッチを適用した状態で、[名前を付けて保存]で既存ファイル（ファイル名：%s%s%s.txt）に上書きを試みたり、S_MessageBox("%s", 0)マクロを実行したりするとメッセージボックスの文字が化けるか異常終了するです（汗）。<br><br>ご確認お願いします。</div></section>
    </li><li><section><h1 id=2177>
    <span class="no">[2177]</span>
    <a class="thread-title" href="#2177">Re6:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-13T18:25:12">2014年05月13日 18:25</time></h1>
    <div class="body">[trunk2_VMessageBoxF_fix_c.patch]<br>19行目: STR_BACKUP_ERR_DELETE は STR_BACKUP_ERR_MOVE の誤りではないか？<br>45行目: pszMsg は LS マクロで取得したポインタなのにローカルコピーしていない<br>→ ここまでチェックしたところで中断（他にパッチ不足とかの問題もあるかもです）。<br><br>この様子だと、労力も過多ですし将来のミス防止も難しいかな？と思いました。<br>次に、費用対効果が高そうな代替案パッチを貼っておきます。<br>採用の可否についてはお任せします。<br><br>【代替案の説明】<br>[MessageBoxF.h]<br>マクロ MessageBox は MessageBoxA/W ではなく Wrap_MessageBox に<br>展開するように変更<br><br>[MessageBox.cpp]<br>Wrap_MessageBox() は タイトル／メッセージをローカルバッファに<br>コピーし、明示リンクで MessageBoxA/W を呼び出す。<br><br>MessageBoxF.h は StdAfx.h に入っているので、すべての .cpp で<br>MessageBox が Wrap_MessageBox に展開されます。<br>メッセージボックス表示がすべて Wrap_MessageBox 経由になるため、<br>これでビルドした sakura.exe を Dependency Walker で確認すると、<br>USER32.dll の MessageBoxA/W への暗黙リンクは無くなっているはずです。<br></div></section>
    <ul><li><section><h1 id=2178>
    <span class="no">[2178]</span>
    <a class="thread-title" href="#2178">代替案パッチ</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-13T18:26:18">2014年05月13日 18:26</time></h1>
    <div class="body">【代替案パッチ】<br>Index: sakura_core/util/MessageBoxF.cpp<br>===================================================================<br>--- sakura_core/util/MessageBoxF.cpp&#9;(リビジョン 3706)<br>+++ sakura_core/util/MessageBoxF.cpp&#9;(作業コピー)<br>@@ -40,6 +40,25 @@<br> // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //<br> //                 メッセージボックス：実装                    //<br> // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //<br>+int Wrap_MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)<br>+{<br>+&#9;static int (WINAPI *RealMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT);<br>+&#9;static HMODULE hMod = NULL;<br>+&#9;if( hMod == NULL ){&#9;// 初期化されていない場合は初期化する<br>+&#9;&#9;hMod = GetModuleHandle(_T("USER32"));<br>+#ifdef _UNICODE<br>+&#9;&#9;*(FARPROC *)&amp;RealMessageBox = GetProcAddress(hMod, "MessageBoxW");<br>+#else<br>+&#9;&#9;*(FARPROC *)&amp;RealMessageBox = GetProcAddress(hMod, "MessageBoxA");<br>+#endif<br>+&#9;}<br>+<br>+&#9;// lpText, lpCaption をローカルバッファにコピーして MessageBox API を呼び出す<br>+&#9;// ※ 使い回しのバッファが使用されていてそれが裏で書き換えられた場合でも<br>+&#9;//    メッセージボックス上の Ctrl+C が文字化けしないように<br>+&#9;return RealMessageBox(hWnd, std::tstring(lpText).c_str(), std::tstring(lpCaption).c_str(), uType);<br>+}<br>+<br> HWND GetMessageBoxOwner(HWND hwndOwner)<br> {<br> &#9;if(hwndOwner==NULL &amp;&amp; g_pcEditWnd){<br>Index: sakura_core/util/MessageBoxF.h<br>===================================================================<br>--- sakura_core/util/MessageBoxF.h&#9;(リビジョン 3706)<br>+++ sakura_core/util/MessageBoxF.h&#9;(作業コピー)<br>@@ -37,6 +37,9 @@<br> // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //<br> <br> //2007.10.02 kobake メッセージボックスの使用はデバッグ時に限らないので、「Debug～」という名前を廃止<br>+#undef MessageBox<br>+#define MessageBox Wrap_MessageBox<br>+int Wrap_MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);<br> <br> //テキスト整形機能付きMessageBox<br> int VMessageBoxF( HWND hwndOwner, UINT uType, LPCTSTR lpCaption, LPCTSTR lpText, va_list&amp; v );<br></div></section>
    </li><li><section><h1 id=2179>
    <span class="no">[2179]</span>
    <a class="thread-title" href="#2179">noviceさん</a>
    <span class="author">（--;</span>
    <time datetime="2014-05-13T23:43:34">2014年05月13日 23:43</time></h1>
    <div class="body">[trunk2_VMessageBoxF_fix_d.patch]<br><br>&gt; [trunk2_VMessageBoxF_fix_c.patch]<br>&gt; 19行目: STR_BACKUP_ERR_DELETE は STR_BACKUP_ERR_MOVE の誤りではないか？<br>&gt; 45行目: pszMsg は LS マクロで取得したポインタなのにローカルコピーしていない<br><br>↑の *45行目* は見ておいてください</div></section>
    </li><li><section><h1 id=2181>
    <span class="no">[2181]</span>
    <a class="thread-title" href="#2181">代替案パッチ（改） 1/2</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-15T12:09:16">2014年05月15日 12:09</time></h1>
    <div class="body">2.1.1.2では、言語を英語に切替えてもメッセージボックスのボタンが<br>日本語（例：はい/いいえ/キャンセル）で表示されるようです。<br>ついでにこの問題も同じ仕掛けで修正してみました。<br><br>投稿許可サイズをちょっとオーバーするので２回に分けます。<br><br>Index: sakura_core/CSelectLang.h<br>===================================================================<br>--- sakura_core/CSelectLang.h&#9;(リビジョン 3706)<br>+++ sakura_core/CSelectLang.h&#9;(作業コピー)<br>@@ -50,6 +50,7 @@<br> &#9;*/<br> &#9;static HINSTANCE getLangRsrcInstance( void );&#9;&#9;&#9;// メッセージリソースDLLのインスタンスハンドルを返す<br> &#9;static LPCTSTR getDefaultLangString( void );&#9;&#9;&#9;// メッセージリソースDLL未読み込み時のデフォルト言語（"(Japanese)" or "(English(United States))"）<br>+&#9;static WORD getLangId( void ){ return m_psLangInfo? m_psLangInfo-&gt;wLangId: 0; }<br> <br> &#9;static HINSTANCE InitializeLanguageEnvironment(void);&#9;&#9;// 言語環境を初期化する<br> &#9;static HINSTANCE LoadLangRsrcLibrary( SSelLangInfo&amp; lang );&#9;// メッセージ用リソースDLLをロードする<br>Index: sakura_core/util/MessageBoxF.h<br>===================================================================<br>--- sakura_core/util/MessageBoxF.h&#9;(リビジョン 3706)<br>+++ sakura_core/util/MessageBoxF.h&#9;(作業コピー)<br>@@ -37,6 +37,9 @@<br> // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //<br> <br> //2007.10.02 kobake メッセージボックスの使用はデバッグ時に限らないので、「Debug～」という名前を廃止<br>+#undef MessageBox<br>+#define MessageBox Wrap_MessageBox<br>+int Wrap_MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType);<br> <br> //テキスト整形機能付きMessageBox<br> int VMessageBoxF( HWND hwndOwner, UINT uType, LPCTSTR lpCaption, LPCTSTR lpText, va_list&amp; v );<br></div></section>
    <ul><li><section><h1 id=2182>
    <span class="no">[2182]</span>
    <a class="thread-title" href="#2182">Re:代替案パッチ（改） 2/2</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-15T12:10:26">2014年05月15日 12:10</time></h1>
    <div class="body">Index: sakura_core/util/MessageBoxF.cpp<br>===================================================================<br>--- sakura_core/util/MessageBoxF.cpp&#9;(リビジョン 3706)<br>+++ sakura_core/util/MessageBoxF.cpp&#9;(作業コピー)<br>@@ -40,6 +40,25 @@<br> // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //<br> //                 メッセージボックス：実装                    //<br> // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- //<br>+int Wrap_MessageBox(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)<br>+{<br>+&#9;static int (WINAPI *RealMessageBox)(HWND, LPCTSTR, LPCTSTR, UINT, WORD);<br>+&#9;static HMODULE hMod = NULL;<br>+&#9;if( hMod == NULL ){&#9;// 初期化されていない場合は初期化する<br>+&#9;&#9;hMod = GetModuleHandle(_T("USER32"));<br>+#ifdef _UNICODE<br>+&#9;&#9;*(FARPROC *)&amp;RealMessageBox = GetProcAddress(hMod, "MessageBoxExW");<br>+#else<br>+&#9;&#9;*(FARPROC *)&amp;RealMessageBox = GetProcAddress(hMod, "MessageBoxExA");<br>+#endif<br>+&#9;}<br>+<br>+&#9;// lpText, lpCaption をローカルバッファにコピーして MessageBox API を呼び出す<br>+&#9;// ※ 使い回しのバッファが使用されていてそれが裏で書き換えられた場合でも<br>+&#9;//    メッセージボックス上の Ctrl+C が文字化けしないように<br>+&#9;return RealMessageBox(hWnd, std::tstring(lpText).c_str(), std::tstring(lpCaption).c_str(), uType, CSelectLang::getLangId());<br>+}<br>+<br> HWND GetMessageBoxOwner(HWND hwndOwner)<br> {<br> &#9;if(hwndOwner==NULL &amp;&amp; g_pcEditWnd){<br></div></section>
    <ul><li><section><h1 id=2189>
    <span class="no">[2189]</span>
    <a class="thread-title" href="#2189">パッチ訂正</a>
    <span class="author">LR4</span>
    <time datetime="2014-06-03T23:10:15">2014年06月03日 23:10</time></h1>
    <div class="body">訂正です。<br>Wrap_MessageBox()の最後で RealMessageBox()を呼んでる箇所を修正する必要があります。<br><br>【誤】+&#9;return RealMessageBox(hWnd, std::tstring(lpText).c_str(), std::tstring(lpCaption).c_str(), uType, CSelectLang::getLangId());<br>【正】+ return RealMessageBox(hWnd, lpText? std::tstring(lpText).c_str(): NULL, lpCaption? std::tstring(lpCaption).c_str(): NULL, uType, CSelectLang::getLangId());<br><br>MessageBox API のタイトルには NULL を指定可能（デフォルトタイトル"Error"を表示）<br>なのに、【誤】のほうで NULL 指定すると異常終了してしまいます。<br><br>しばらく【誤】のほうを使っていたところ、<br>Wikiではなく、どこかから拾ってきた「選択範囲を MSDN(VS2008用) で検索」マクロで、<br>オンライン優先にした場合に時間がかかってエラーになるケースで異常終了しました。</div></section>
    </li></ul></li></ul></li></ul></li></ul></li><li><section><h1 id=2183>
    <span class="no">[2183]</span>
    <a class="thread-title" href="#2183">Re5:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">もか</span>
    <time datetime="2014-05-16T00:29:53">2014年05月16日 00:29</time></h1>
    <div class="body">MessageBoxやDialogBox*(ついでにSHBrowseForFolder、GetOpenFileName等)は内部でGetMessage等を呼び出してメッセージ処理をするから、<br>BlockingHookと同じように他のウィンドウのメッセージが処理されることを意識する必要があるってことですね<br>(サクラのコードはBlockingHookもほとんど他の処理が走ることを考慮していませんけど)<br><br>VMessageBoxFを表示中にさらにVMessageBoxFが表示されることがあるようです。<br>何かのダイアログが表示された状態で、親ウィンドウにWM_CLOSEが送られてきたとか。<br>ためしに、編集中ドキュメントを[X]で閉じようとして「保存しますか？」ときかれてきて、<br>その状態でタスクバー(Win7)から「このウィンドウを閉じる」を選んだら、<br>もう一つ「保存しますか？」が表示されました。<br>1つめが他のダイアログだった場合は、VMessageBoxFのszBufはstaticなので、<br>2つめをキャンセルして1つめに戻ってきた場合に、よろしくないんじゃないでしょうか。<br>LR4さんの代替案ならWarpでコピーされて問題なさそうです。<br><br>考慮したほうがいいことで思いつくことは<br>1.バッファのリサイクル(LS/LSW/to_*char)<br>2.staticになってる変数等の再入問題<br>3.API呼び出し前にチェックしたファイル・ウィンドウ・共有変数等の内容が変更になっている可能性<br>4.プロセス(親ウィンドウ)の終了<br>とかいろいろありますが現状は結構手抜きのはず。<br></div></section>
    <ul><li><section><h1 id=2186>
    <span class="no">[2186]</span>
    <a class="thread-title" href="#2186">Re6:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-16T09:50:12">2014年05月16日 09:50</time></h1>
    <div class="body">残念なことですが、複数のメッセージボックスを表示している場合ですが、*各メッセージボックスの文字列バッファが独立したものになっていても*、どのメッセージボックスに対するCtrl+Cも、常に最後に出したメッセージボックスのテキストがクリップボードに入ります。<br>最後のメッセージボックスを閉じるとひとつ前のメッセージボックスのテキストになります。<br>（MessageBox APIの側で常に末尾スタックに積まれたバッファポインタを参照しているのかな？という挙動です）<br><br>サクラとは別に、Visual Studioが生成する最も単純なWin32 Appに少し手を加えただけのプログラムで検証しても同様でした。<br><br>サクラでは検索ボックスと置換ボックスを同時に出して、<br>検索ボックス：検索条件を指定してください<br>置換ボックス：前方(↓) に文字列 'x' が１つも見つかりません<br>のメッセージを同時に出すことができます。<br>上記に加えて、「閉じる前に保存しますか？」も簡単に出せますね。<br><br>メッセージフックでもして自コード内にクリップボード処理を回せば矯正できるとは思いますが、さすがにそれはアレなので、複数表示についてはあきらめて期待通りには動かないのが「仕様」ということにしておくほうが賢明と思います。<br>１個だけ表示しているときは期待通り動く、というところまでの対策で妥協しましょう（汗）</div></section>
    <ul><li><section><h1 id=2187>
    <span class="no">[2187]</span>
    <a class="thread-title" href="#2187">Re7:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-16T10:30:39">2014年05月16日 10:30</time></h1>
    <div class="body">&gt; 最後のメッセージボックスを閉じるとひとつ前のメッセージボックスのテキストになります。<br><br>すみません、必ずしもこのルール通りではないようです。時折、違う挙動が起きるような？…<br>ちなみに、メモ帳でも検索ダイアログの「"x"が見つかりません」と「無題 への変更内容を保存しますか?」を同時に出したりできますが、やはり変な挙動になります。</div></section>
    </li><li><section><h1 id=2188>
    <span class="no">[2188]</span>
    <a class="thread-title" href="#2188">Re7:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">LR4</span>
    <time datetime="2014-05-16T18:21:43">2014年05月16日 18:21</time></h1>
    <div class="body">&gt;どのメッセージボックスに対するCtrl+Cも、常に最後に出したメッセージボックスのテキストがクリップボードに入ります。<br><br>Spy++で見たら、どのウィンドウがアクティブかに関わらずメッセージループを回しているメッセージボックス（最後に表示したメッセージボックス）に WM_COPY が送られていました。<br>エディタウィンドウをアクティブにしている時でも。</div></section>
    <ul><li><section><h1 id=2265>
    <span class="no">[2265]</span>
    <a class="thread-title" href="#2265">Re8:不具合：「開きません」のキャンセルが存在しません</a>
    <span class="author">syat</span>
    <time datetime="2015-07-09T22:30:13">2015年07月09日 22:30</time></h1>
    <div class="body">LR4さんのパッチをトラッカーに登録しました。(patchunicode/816)<br>問題なさそうなのでこちらを採用したいと思います。</div></section>
    </li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></li></ul></body></html>